// import { config } from '../config.js'

const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。',
  1000: 'fail：没有进入后端请求数据，请联系开发者检查请求的合法值'
}

function _show_error (code, response_message) {
  wx.showToast({
    title: response_message || (codeMessage[code] ? codeMessage[code] : code),
    icon: 'none',
    duration: 2500
  })
}

export default class Axios {
  //* **  微信请求接口 ****//
  static request (
    url,
    { data = {}, method = 'GET', dataType = 'json', ...otherParams }
  ) {
    return new Promise((resolve, reject) => {
      wx.request({
        url: url,
        data: {
          loginChannel: 'WX_APPLET',
          ...data
        },
        method: method,
        dataType: dataType,
        header: {
          OPENIDTOKEN: wx.getStorageSync('OPENIDTOKEN') || null,
          'content-type':
            'application/x-www-form-urlencoded;application/json;application/json'
        },
        ...otherParams,
        success: res => {
          resolve(res)
          // console.log('success：响应报文状态码', res.statusCode)
          const code = res.statusCode.toString() // startsWith 从头的截取 //endsWith 从尾巴的截取
          if (!code.startsWith('2')) {
            _show_error(code, res.message)
          }
        },

        fail: err => {
          // console.log('fail：失败的响应报文', err)
          reject(err)
          _show_error(1000)
        }
      })
    })
  }

  //* **  微信下载文件接口 ****//
  static downloadFile (params) {
    return new Promise((resolve, reject) => {
      wx.downloadFile({
        url: 'https://example.com/audio/123', // 仅为示例，并非真实的资源
        success (res) {
          // 只要服务器有响应数据，就会把响应内容写入文件并进入 success 回调，业务需要自行判断是否下载到了想要的内容
          if (res.statusCode === 200) {
            // wx.playVoice({ filePath: res.tempFilePath })
            resolve(res)
          }
        }
      })
    })
  }

  //* **  微信上传文件接口 ****//
  static uploadFile (params) {
    return new Promise((resolve, reject) => {
      // wx.chooseImage({
      // success (res) {
      // const tempFilePaths = res.tempFilePaths
      wx.uploadFile({
        // url: 'https://example.weixin.qq.com/upload', //仅为示例，非真实的接口地址
        // filePath: tempFilePaths[0],
        // name: 'file',
        // formData: {
        //   'user': 'test'
        // },
        ...params,
        success (res) {
          const data = res.data
          if (data) {
            resolve(data)
          }
        }
      })
      // }
      // })
    })
  }
}

// todo kim-stamp设置缓存 wx.setStorageSync('OPENIDTOKEN', OPENIDTOKEN)

// ——————————————————————————————      微信请求接口文档     ———————————————————————————————————————————
// RequestTask wx.request(Object object)
// 发起 HTTPS 网络请求。使用前请注意阅读相关说明。
// 参数
// Object object
// 属性	               类型	默认值	必填	说明	最低版本
// url	               string		是	开发者服务器接口地址
// data	               string/object/ArrayBuffer		否	请求的参数
// header	             Object		否	设置请求的 header，header 中不能设置 Referer。
// content-type        默认为 application/json
// method	             string	GET	否	HTTP 请求方法
// dataType	           string	json	否	返回的数据格式
// responseType	       string	text	否	响应的数据类型	1.7.0
// success	           function		否	接口调用成功的回调函数
// fail	               function		否	接口调用失败的回调函数
// complete	           function		否	接口调用结束的回调函数（调用成功、失败都会执行）

// object.method 的合法值
// 值	                 说明	最低版本
// OPTIONS	           HTTP 请求 OPTIONS
// GET	               HTTP 请求 GET
// HEAD	               HTTP 请求 HEAD
// POST	               HTTP 请求 POST
// PUT	               HTTP 请求 PUT
// DELETE	             HTTP 请求 DELETE
// TRACE	             HTTP 请求 TRACE
// CONNECT	           HTTP 请求 CONNECT

// object.dataType 的合法值
// 值	                 说明	最低版本
// json	               返回的数据为 JSON，返回后会对返回的数据进行一次 JSON.parse
// 其他	               不对返回的内容进行 JSON.parse

// object.responseType 的合法值
// 值	                 说明	最低版本
// text	               响应的数据为文本
// arraybuffer	       响应的数据为 ArrayBuffer

// object.success 回调函数
// 参数 Object res
// 属性	               类型	说明	最低版本
// data	               string/Object/Arraybuffer	开发者服务器返回的数据
// statusCode	         number	开发者服务器返回的 HTTP 状态码
// header	             Object	开发者服务器返回的 HTTP Response Header	1.2.0

// ------------------------------------------------------------------------------------
// 通常http的header()
// header()函数的作用是：发送一个原始 HTTP 标头[Http Header]到客户端。
// 标头 (header) 是服务器以 HTTP 协义传 HTML 资料到浏览器前所送出的字串，在标头与 HTML 文件之间尚需空一行分隔。在 PHP 中送回 HTML 资料前，需先传完所有的标头。
// 常用header汇总：
// header('Content-Type: text/html; charset=utf-8'); //网页编码
// header('Content-Type: text/plain'); //纯文本格式
// header('Content-Type: image/jpeg'); //JPG、JPEG
// header('Content-Type: application/zip'); // ZIP文件
// header('Content-Type: application/pdf'); // PDF文件
// header('Content-Type: audio/mpeg'); // 音频文件
// header('Content-type: text/css'); //css文件
// header('Content-type: text/javascript'); //js文件
// header('Content-type: application/json'); //json
// header('Content-type: application/pdf'); //pdf
// header('Content-type: text/xml'); //xml
// header('Content-Type: application/x-shockw**e-flash'); //Flash动画
// ------------------------------------------------------------------------------------

// data 参数说明
// 最终发送给服务器的数据是 String 类型，如果传入的 data 不是 String 类型，会被转换成 String 。转换规则如下：
// 对于 GET 方法的数据，会将数据转换成 query string（encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=encodeURIComponent(v)...）
// 对于 POST 方法且 header['content-type'] 为 application/json 的数据，会对数据进行 JSON 序列化
// 对于 POST 方法且 header['content-type'] 为 application/x-www-form-urlencoded 的数据，会将数据转换成 query string （encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=encodeURIComponent(v)...）

// 返回值
// RequestTask
// 基础库 1.4.0 开始支持，低版本需做兼容处理。
// 请求任务对象

// RequestTask.abort()  中断请求任务
// RequestTask.onHeadersReceived(function callback)   监听 HTTP Response Header 事件。会比请求完成事件更早
// RequestTask.offHeadersReceived(function callback)  取消监听 HTTP Response Header 事件

// 示例代码
// const requestTask = wx.request({
//   url: 'test.php', //仅为示例，并非真实的接口地址
//   data: {
//     x: '' ,
//     y: ''
//   },
//   header: {
//     'content-type': 'application/json'
//   },
//   success (res) {
//     console.log(res.data)
//   }
// })
// requestTask.abort()

// ——————————————————————————————      微信下载文件资源文档     ———————————————————————————————————————————
// DownloadTask wx.downloadFile(Object object)
// 下载文件资源到本地。客户端直接发起一个 HTTPS GET 请求，返回文件的本地临时路径，单次下载允许的最大文件为 50MB。使用前请注意阅读相关说明。
// 注意：请在服务端响应的 header 中指定合理的 Content-Type 字段，以保证客户端正确处理文件类型

// 参数 Object object
// 属性	           类型	默认值	必填	说明	最低版本
// url	          string		是	下载资源的 url
// header	        Object		否	HTTP 请求的 Header，Header 中不能设置 Referer
// filePath	      string		否	指定文件下载后存储的路径	1.8.0
// success	      function		否	接口调用成功的回调函数
// fail	          function		否	接口调用失败的回调函数
// complete	      function		否	接口调用结束的回调函数（调用成功、失败都会执行）

// object.success 回调函数
// 参数 Object res
// 属性	           类型	说明
// tempFilePath	  string	临时文件路径。没传入 filePath 指定文件存储路径时会返回，下载后的文件会存储到一个临时文件
// filePath	      string	用户文件路径。传入 filePath 时会返回，跟传入的 filePath 一致
// statusCode	    number	开发者服务器返回的 HTTP 状态码

// 返回值
// DownloadTask
// 基础库 1.4.0 开始支持，低版本需做兼容处理。
// 一个可以监听下载进度变化事件和取消下载的对象

// 方法
// DownloadTask.abort()   中断下载任务
// DownloadTask.onProgressUpdate(function callback)   监听下载进度变化事件
// DownloadTask.offProgressUpdate(function callback)   取消监听下载进度变化事件
// DownloadTask.onHeadersReceived(function callback)   监听 HTTP Response Header 事件。会比请求完成事件更早
// DownloadTask.offHeadersReceived(function callback)   取消监听 HTTP Response Header 事件
// 示例代码
// const downloadTask = wx.downloadFile({
//   url: 'http://example.com/audio/123', //仅为示例，并非真实的资源
//   success (res) {
//     wx.playVoice({
//       filePath: res.tempFilePath
//     })
//   }
// })
// downloadTask.onProgressUpdate((res) => {
//   console.log('下载进度', res.progress)
//   console.log('已经下载的数据长度', res.totalBytesWritten)
//   console.log('预期需要下载的数据总长度', res.totalBytesExpectedToWrite)
// })
// downloadTask.abort() // 取消下载任务

// ——————————————————————————————      微信上传文件资源文档     ———————————————————————————————————————————
// UploadTask wx.uploadFile(Object object)
// 将本地资源上传到服务器。客户端发起一个 HTTPS POST 请求，其中 content-type 为 multipart/form-data。使用前请注意阅读相关说明。

// 参数 Object object
// 属性	          类型	默认值	必填	说明
// url	          string		是	开发者服务器地址
// filePath	      string		是	要上传文件资源的路径
// name	          string		是	文件对应的 key，开发者在服务端可以通过这个 key 获取文件的二进制内容
// header	        Object		否	HTTP 请求 Header，Header 中不能设置 Referer
// formData	      Object		否	HTTP 请求中其他额外的 form data
// success	      function		否	接口调用成功的回调函数
// fail	          function		否	接口调用失败的回调函数
// complete	      function		否	接口调用结束的回调函数（调用成功、失败都会执行）

// object.success 回调函数
// 参数 Object res
// 属性	          类型	说明
// data	          string	开发者服务器返回的数据
// statusCode	    number	开发者服务器返回的 HTTP 状态码

// 返回值
// UploadTask
// 基础库 1.4.0 开始支持，低版本需做兼容处理。
// 一个可以监听上传进度进度变化的事件和取消上传的对象
// 示例代码
// wx.chooseImage({
//   success (res) {
//     const tempFilePaths = res.tempFilePaths
//     wx.uploadFile({
//       url: 'https://example.weixin.qq.com/upload',
//       filePath: tempFilePaths[0],
//       name: 'file',
//       formData: {
//         'user': 'test'
//       },
//       success (res){
//         const data = res.data
//         //do something
//       }
//     })
//   }
// })

//* *  Http请求中Content-Type */
// text/html ： HTML格式
// text/plain ：纯文本格式
// text/xml ：  XML格式
// image/gif ：gif图片格式
// image/jpeg ：jpg图片格式
// image/png：png图片格式

// 以application开头的媒体格式类型：
// application/xhtml+xml ：XHTML格式
// application/xml     ： XML数据格式
// application/atom+xml  ：Atom XML聚合格式
// application/json    ： JSON数据格式
// application/pdf       ：pdf格式
// application/msword  ： Word文档格式
// application/octet-stream ： 二进制流数据（如常见的文件下载）
// application/x-www-form-urlencoded ： <form encType=””>中默认的encType，form表单数据被编码为key/value格式发送到服务器（表单默认的提交数据的格式）
// 另外一种常见的媒体格式是上传文件之时使用的：
// multipart/form-data ： 需要在表单中进行文件上传时，就需要使用该格式
